package com.ruoyi.system.domain;

public class Result<T> {

//    private Integer code;
//    private String message;
//    private T data;

//    public Result() {}

    public Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    /**
     * 响应状态码：200成功，500失败，可扩展其他业务码（如401未授权、404资源不存在等）
     */
    private Integer code;
    /**
     * 响应消息：提示用户的文本，如“操作成功”“参数校验失败”等
     */
    private String message;
    /**
     * 响应数据：具体返回给前端的内容，如实体对象、列表、统计数据等
     */
    private T data;

    /**
     * 私有构造方法，避免直接 new，通过静态方法创建实例
     */
    private Result() {}

    // ================== 常用静态工厂方法 ==================
    /**
     * 成功响应（带数据）
     * @param data 要返回的数据
     * @param <T>  数据泛型
     * @return 封装好的 Result 对象
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("操作成功");
        result.setData(data);
        return result;
    }

    /**
     * 成功响应（不带数据，仅提示成功）
     * @param <T> 数据泛型（实际无数据时可传 Void 或忽略）
     * @return 封装好的 Result 对象
     */
    public static <T> Result<T> success() {
        Result<T> result = new Result<>();
        result.setCode(200);
        result.setMessage("操作成功");
        result.setData(null);
        return result;
    }

    /**
     * 失败响应（自定义状态码和消息）
     * @param code    自定义状态码
     * @param message 失败提示消息
     * @param <T>     数据泛型（失败时通常无有效数据，可传 Void）
     * @return 封装好的 Result 对象
     */
    public static <T> Result<T> error(Integer code, String message) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        result.setData(null);
        return result;
    }

    /**
     * 通用失败响应（默认状态码 500，提示“操作失败”）
     * @param <T> 数据泛型（失败时通常无有效数据，可传 Void）
     * @return 封装好的 Result 对象
     */
    public static <T> Result<T> error() {
        return error(500, "操作失败");
    }

    /**
     * 自定义失败消息的响应（默认状态码 500）
     * @param message 失败提示消息
     * @param <T>     数据泛型（失败时通常无有效数据，可传 Void）
     * @return 封装好的 Result 对象
     */
    public static <T> Result<T> error(String message) {
        return error(500, message);
    }
}
